package com.majun.base.operate;

import java.util.List;

import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

/**
 * map：将Mono中的值或Flux中的每个元素转换为另一种类型；
 * 
 * flatmap：将Mono中的值或Flux中的每个元素转换为另一个Mono或另一个Publisher，并展平结果；
 * 
 * flatMapSequential：类似于flatMap，但保持顺序并并行处理；
 * 
 * flatMapMany：将Mono中的值转换为Flux；
 * 
 * collectList： 将Flux中的所有元素收集到一个List中，返回Mono<List<T>>；
 * 
 * collectMap：将Flux中的元素收集到一个Map中，返回Mono<Map<K,V>>；
 * 
 * reduce：聚合Flux中的元素，返回Mono；
 * 
 * buffer：将Flux中的元素收集到List中，按指定大小进行分组；
 * 
 * window：将Flux中的元素分组到Flux中，每组包含指定数量的元素；
 */
public class ConversionExample {
	public static void main(String[] args) {
		// 示例 1: 使用 Mono 转换操作符
		Mono<Integer> mono = Mono.just("123").map(Integer::parseInt).flatMap(i -> Mono.just(i * 2))
				.doOnNext(System.out::println);

		mono.subscribe();

		// 示例 2: 使用 Flux 转换操作符
		Flux<List<Integer>> flux = Flux.just("1", "2", "3", "4", "5").map(Integer::parseInt).filter(i -> i % 2 == 0)
				.flatMap(i -> Flux.just(i * 2)).concatMap(i -> Flux.just(i + 1)).buffer(2)
				.doOnNext(System.out::println);

		flux.subscribe();

		// 示例 3: 使用 Flux 转换操作符
		Flux<Integer> concatMap = Flux.just("1", "2", "3", "4", "5").map(Integer::parseInt).filter(i -> i % 2 == 0)
				.flatMap(i -> Flux.just(i * 2)).concatMap(i -> Flux.just(i + 1));

		concatMap.subscribe(System.out::println);
	}
}
